/* 
 * File:   CommandMap.h
 * Author: Gab'z
 *
 * Created on 27 mai 2012, 18:22
 */

#ifndef COMMANDMAP_H
#define	COMMANDMAP_H

#include <map>
#include <string>
#include "Command.h"
//#include "UserCommand.h"
#include "../../exception/CommandException.h"

namespace calculator {

    /**
     * Classe conteneur des Command fixes de l'application.
     * et des commandes utilisateurs
     * Utilisation du Design Pattern Prototype.
     */
    class CommandMap {
    public:

        /**
         * Singleton CommandMap.
         * @return crée et/ou renvoie l'unique instance de CommandMap.
         */
        static CommandMap* getInstance();

        /**
         * Singleton CommandMap.
         * Détruit l'unique instance de CommandMap.
         * Libère la mémoire prise par les commandes stockées.
         */
        static void deleteInstance();

        //        void addReplaceUserCommand(const UserCommand* uc);
        //        void removeUserCommand(const std::string& str);

        /**
         * Parcours la liste de commande pour déterminer si la commande demandée
         * existe.
         * @param str le nom de la commande recherchée.
         * @return true si la commande existe.
         * 
         * Remarque : on aurait pu renvoyer un itérateur et éviter de lancer 
         * éventuellement une exception pour la méthode getCommand(const std::string& str).
         */
        bool isCommandName(const std::string& str) const;

        /**
         * Parcours la liste et renvoie la commande si le nom correspond.
         * Lance une exception si elle n'est pas trouvée.
         * @param str le nom de la commande demandée.
         * @return une copie de la commande demandée.
         */
        const Command* getCommand(const std::string& str) const throw (CommandException);

    private:
        
        /**
         * instance du Singleton CommandMap.
         */
        static CommandMap* instance;
        
        /**
         * Constructeur privé utilisé par le Singleton.
         */
        CommandMap();
        
        /**
         * Destructeur privé utilisé par le Singleton.
         */
        virtual ~CommandMap();

        /**
         * Conteneur de commandes pour la copie @see Command
         */
        std::map<const std::string, const Command*> _commandMap;
        // std::map<const std::string, const UserCommand*> _userCommandMap;
        
        /**
         * Méthode permettant d'ajouter des commandes à la liste
         * Utilisé au démarrage de l'application ou pour ajouter des commandes utilisateurs
         * @param command la commande à ajouter
         */
        void addCommand(const Command* command);
    };
}

#endif	/* COMMANDMAP_H */

